#ifndef _CAMERA_H_
#define _CAMERA_H_

#include "common.h"

class CCamera
{
private:
    PHMATRIX      m_mProjectionMatrix;
    PHMATRIX      m_mViewMatrix;
	PHMATRIX	m_mProjectionViewMatrix;
public:
    CCamera(void);
    ~CCamera(void);

/*=====================================================================
    Projection View Matrix Functions
//===================================================================*/
	PHMATRIX GetProjectionViewMatrix(void);

/*=====================================================================
    Projection Matrix Functions
//===================================================================*/
    PHMATRIX GetProjectionMatrix(void);
    void SetProjectionMatrix(PHMATRIX *_mMatrix);
    void BuildPerspective(float _fFieldOfView, float _fAspect, float _fZNear, float _fZFar);
    
/*=====================================================================
    View Matrix Functions
//===================================================================*/
    PHMATRIX GetViewMatrix(bool _bTranslate = true);
    void SetViewMatrix(PHMATRIX *_mMatrix);
    void NormalizeViewMatrix(void);

    PHVEC3 GetViewXAxis(void);
    void SetViewXAxis(PHVEC3 _vPosition);
    void SetViewXAxis(float _fX, float _fY, float _fZ);

    PHVEC3 GetViewYAxis(void);
    void SetViewYAxis(PHVEC3 _vPosition);
    void SetViewYAxis(float _fX, float _fY, float _fZ);

    PHVEC3 GetViewZAxis(void);
    void SetViewZAxis(PHVEC3 _vPosition);
    void SetViewZAxis(float _fX, float _fY, float _fZ);

    PHVEC3 GetViewPosition(void);
    void SetViewPosition(PHVEC3 _vPosition);
    void SetViewPosition(float _fX, float _fY, float _fZ);
    
    /*=================================================================
        Local Transform Functions
    //===============================================================*/
    void ViewRotateLocalX(float _fAngle);
    void ViewRotateLocalY(float _fAngle);
    void ViewRotateLocalZ(float _fAngle);
    
    void ViewTranslateLocal(PHVEC3 _vAxis, bool _bFPS = false);
    void ViewTranslateLocalX(float _fScale, bool _bFPS = false);
    void ViewTranslateLocalY(float _fScale, bool _bFPS = false);
    void ViewTranslateLocalZ(float _fScale, bool _bFPS = false);

    /*=================================================================
        Global Transform Functions
    //===============================================================*/
    void ViewRotateGlobalX(float _fAngle);
    void ViewRotateGlobalY(float _fAngle);
    void ViewRotateGlobalZ(float _fAngle);

    void ViewTranslateGlobal(PHVEC3 _vAxis);
    void ViewTranslateGlobalX(float _fScale);
    void ViewTranslateGlobalY(float _fScale);
    void ViewTranslateGlobalZ(float _fScale);
};
#endif //_CAMERA_H_